/*
 * @Author: LVGRAPE
 * @Date: 2023-11-09 11:22:08
 * @LastEditTime: 2023-11-15 11:35:04
 * @LastEditors: LVGRAPE
 * @Description: 
 * @FilePath: \zino_fc_v0\zino\rgb\rgb.c
 * 要啥没啥，爱咋咋的
 */
#include "TMR_Configuration.h"

#define TMR9_DIV 20
#define TMR9_PERIOD 500
#define TMR11_DIV 20
#define TMR11_PERIOD 200
#define TMRx_CHANNLEx_INIT(T, C) TMR_OC##C##Init(T, &TMRx_OCInitStructure);

struct rgb_timer_s
{
	uint16_t r;
	uint16_t g;
	uint16_t b;
	uint16_t c;
} rgb_timer;

/**
 * @brief  配置TMR11用来控制led和ip5306的开关机
 * @note   led控制频率15khz
 * @retval None
 */
void TMR9_INIT_FOR_LED_IP5306(void)
{
	// NOTE 本来是用TMR9 PWM通道的，但是通道有点不稳定，所以改TMR11溢出中断
	RCC->APB2EN |= RCC_APB2PERIPH_TMR11; // RGB 控制，电源
	NVIC_Config(TMR1_TRG_HALL_TMR11_IRQn, 1, 1, ENABLE);

	TMRx_Init(TMR11, TMR11_DIV, TMR11_PERIOD);

	TMR_INTConfig(TMR11, TMR_INT_Overflow, ENABLE);

	TMR_Cmd(TMR11, ENABLE);
}
#define RGB_MAX_PERIOD 500
typedef struct led_rgb_range
{
	uint16_t min;
	uint16_t max;
} led_rgb_range_s;
typedef struct ledCalibration
{
	led_rgb_range_s r;
	led_rgb_range_s g;
	led_rgb_range_s b;
} ledCalibration_s;
static ledCalibration_s RGB_CALIBRATION_VALUE = {
	.r = {0, 100},
	.g = {0, 250},
	.b = {0, 250},
};
/**
 * @brief  限定RGB各个颜色的亮度范围，用来校色
 * @note   每个的颜色的最大亮度为500,通道设置各个颜色的最大值和最小值可以让它们亮度一致性好点
 * @param  rgb: 0:R, 1:G, 2:B
 * @param  min: 最小亮度
 * @param  max: 最大亮度
 * @retval None
 */
void RGB_LED_CLIBARATION(uint8_t rgb, uint16_t min, uint16_t max)
{
	if (rgb == 0)
	{
		RGB_CALIBRATION_VALUE.r.min = min;
		RGB_CALIBRATION_VALUE.r.max = max;
	}
	else if (rgb == 1)
	{
		RGB_CALIBRATION_VALUE.g.min = min;
		RGB_CALIBRATION_VALUE.g.max = max;
	}
	else if (rgb == 2)
	{
		RGB_CALIBRATION_VALUE.b.min = min;
		RGB_CALIBRATION_VALUE.b.max = max;
	}
}
/**
 * @brief  设置RGB的亮度输出值
 * @note
 * @param  r: 红色
 * @param  g: 绿色
 * @param  b: 蓝色
 * @retval None
 */
void rgb_led_set(uint8_t r, uint8_t g, uint8_t b)
{
	// NOTE 在mixly做呼吸灯的时候，小点数循环计算后要清零，不然会出现if(0.3 >= 0){...}不执行的诡异情况
	/*
	 * 实际输出值=最小亮度值+ 颜色范围(0~255)的设定值 x（最大亮度值-最小亮度值）/颜色范围（256）;
	 * */
	rgb_timer.r = constrain((RGB_CALIBRATION_VALUE.r.min + r * (RGB_CALIBRATION_VALUE.r.max - RGB_CALIBRATION_VALUE.r.min) / 256), 0, RGB_MAX_PERIOD);
	rgb_timer.g = constrain((RGB_CALIBRATION_VALUE.g.min + g * (RGB_CALIBRATION_VALUE.g.max - RGB_CALIBRATION_VALUE.g.min) / 256), 0, RGB_MAX_PERIOD);
	rgb_timer.b = constrain((RGB_CALIBRATION_VALUE.b.min + b * (RGB_CALIBRATION_VALUE.b.max - RGB_CALIBRATION_VALUE.b.min) / 256), 0, RGB_MAX_PERIOD);

}
// /*TMR1触发中断和TMR11溢出中断，这里只用TMR11的溢出中断来控制RGB和IP5306*/
// void TMR1_TRG_HALL_TMR11_IRQHandler(void)
// {
// 	if (TMR_GetINTStatus(TMR11, TMR_INT_Overflow) != RESET)
// 	{

// 		TMR_ClearITPendingBit(TMR11, TMR_INT_Overflow);
// #if defined(ZINO_PREMIUM) || defined(ZINO_LITE) || defined(ZINO_NP)
// 		// #ifdef WingOfSky
// 		// 		AirDronepwrLedHandle();
// 		// #elif HeartOfMecha
// 		pwrLedHandle();

// #endif // ZINO_LITE
// 		if (rgb_timer.r || rgb_timer.g || rgb_timer.b)
// 		{
// 			rgb_timer.c++;
// 			if (rgb_timer.c > RGB_MAX_PERIOD)
// 			{
// 				rgb_timer.c = 0;
// 				RLED(ON);
// 				GLED(ON);
// 				BLED(ON);
// 			}
// 			if (rgb_timer.c > rgb_timer.r)
// 			{
// 				RLED(OFF);
// 			}
// 			if (rgb_timer.c > rgb_timer.g)
// 			{
// 				GLED(OFF);
// 			}
// 			if (rgb_timer.c > rgb_timer.b)
// 			{
// 				BLED(OFF);
// 			}
// 		}
// 		else
// 		{
// 			RLED(OFF);
// 			GLED(OFF);
// 			BLED(OFF);
// 		}
// 		if (ip5306_pulse.state)
// 		{
// 			static bool flip;
// 			if (++ip5306_pulse.clock_int == SystemCoreClock / TMR11_DIV / TMR11_PERIOD / 1000)
// 			{
// 				ip5306_pulse.clock_int = 0;
// 				if (++ip5306_pulse.clock_ms == ip5306_pulse.pulseWidth)
// 				{
// 					ip5306_pulse.clock_ms = 0;
// 					flip = !flip;
// 					if (++ip5306_pulse.clock_pulse == ip5306_pulse.pulseCount * 2)
// 					{
// 						flip = 0;
// 						ip5306_pulse.clock_pulse = 0;
// 						ip5306_pulse.state = false;
// 						ip5306_PindMode(GPIO_Mode_IN_FLOATING);
// 					}
// 				}
// 			}
// 			if (!flip)
// 			{

// 				IP_CTRL_LOW();
// 			}
// 			else
// 			{
// 				IP_CTRL_HIGH();
// 			}
// 		}
// 	}
// }